<?php
namespace classlib\core\view;
abstract class view_abstract {
	/**
	 * 主要是缓存debug输出的缓存资料信息
	 * @var unknown
	 */
	static $debug = '';
	
	/**
	 * 设置缓存介质，直接继承
	 * @var classlib/cache/Icache
	 */
	protected $cache;
	
	/**
	 * 变量赋值
	 * @param string $key
	 * @param mix    $val
	 * @return view_abstract
	 */
	abstract public function assign($key, $val);
	
	/**
	 * 变量赋值引用赋值
	 * @param string $key
	 * @param mix $val
	 * @return view_abstract
	 */
	abstract public function assign_by_ref($key, &$val);
	
	/**
	 * 错误码复制直接退出
	 * @param string $code
	 * @param string $msg
	 */
	public function assign_error($code, $msg) {
		echo $code, $msg;
		exit;
	}
	
	/**
	 * 404错误信息提示资料信息
	 * @param int $errno
	 * @param string $message
	 */
	public function page_404($errno, $message) {
		header("HTTP/1.0 404 Not Found");
		header("Status: 404 Not Found");
		exit;
	}

	/**
	 * 已经分配的变量的获取 默认取所有
	 * @param string $key
	 * @return mix
	 */
	abstract public function get_template_vars($key=false);
	
	/**
	 * 将要输出的资料获取
	 * @param string  $tpl
	 * @param boolean $iscache
	 * @return string
	 */
	abstract public function fetch($tpl=false);
	
	/**
	 * 主要是为了迎合smarty而做的处理
	 * @param string $tpl_file
	 * @param string $cache_id
	 */
	public function is_cached($tpl_file, $cache_id = null) {
		return false;
	}
	
	/**
	 * 设置缓存的cache资料信息
	 * @param classlib/cache $cache
	 */
	public function set_cache($cache) {
		$this->cache = $cache;
		return $this;
	}
	
	/**
	 * 设置发布目录资料信息
	 * @param string $pubdir
	 */
	public function setpubdir($pubdir) {
		return false;
	}
	
	/**
	 * 直接将一个字符串输出缓冲区
	 * @param unknown $html
	 */
	public function out($html) {
		echo $html;
	}
	
	/**
	 * 重载Smarty输出的资料输出
	 * @param string  $tpl
	 * @param string  $cacheid  区别同一个页面不同展示模版
	 * @param int     $lifetime
	 * @see Smarty  $caching
	 */
	public function display($tpl=false, $cacheid=null, $lifetime = -1) {
		self::$debug = '';
		$loop  		 = 0;
		$maxlp 		 = 5;
		while (ob_get_level() > 0) {
			self::$debug .= @ob_get_contents();
			ob_end_clean();
			if ($loop++ > $maxlp) {
				break;
			}
		}
		//是否调试模式，如果是的话则不输出debug信息
		if (defined('OPENDEBUG') && OPENDEBUG && self::$debug) {
			self::$debug = strip_tags(self::$debug);
			$this->assign('debug', htmlspecialchars(self::$debug, ENT_QUOTES));
		}
	}
}